package com.itheima.config;

import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;


import com.itheima.utils.JwtUtils;
import com.itheima.utils.Result;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*") //配置表明当前类是一个过滤器类，并且过滤所有的请求
@Slf4j
public class LoginFilter  implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        log.info("过滤器，放行前，路径：{}",request.getRequestURL());
//        如果是登陆接口，就直接放行
        String requestURL = request.getRequestURL().toString();

        if (requestURL.contains("/login")){
//            是登陆接口 直接放行
            filterChain.doFilter(request,response);
            return;
        }


//        从请求头中获得token
        String token = request.getHeader("token");

        if (StringUtils.isEmpty(token)){
        // 告诉前端，需要登陆，前端自动跳转到登陆页面
            log.info("过滤器，jwt是空的，请跳转登陆页面登陆");
            Result result = Result.error("NOT_LOGIN");
//            将对象转成json字符串
            String resultjson = JSON.toJSONString(result);
//            使用响应头告诉浏览器 传输的json字符串
            response.setContentType("text/plain; charset=UTF-8");
            response.getWriter().write(resultjson);

            return;
        }


//        如果token不为空 解析

        Claims claims;
        try {
            claims = JwtUtils.parseJWT(token);
            log.info("你的token解析后的",claims);
//            如果解析没有问题，直接放行
            filterChain.doFilter(request,response);

        } catch (Exception e) {
//如果解析有问题，抛异常，返回信息告诉前端，token失效了，可以登陆，重新获取
//            e.printStackTrace();
            log.info("过滤器，jwt失效了");
            Result result = Result.error("NOT_LOGIN");
//            将对象转成json字符串
            String resultjson = JSON.toJSONString(result);
//            使用响应头告诉浏览器 传输的json字符串
            response.setContentType("text/plain; charset=UTF-8");
            response.getWriter().write(resultjson);
            return;

        }


    }



}
